﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Datos.Logger;
using Entidades;

namespace Logica.WebServices_BCR
{
    
    public static class Services
    {       
        public enum errorType { Error_Message,Log_Message,  Information_Message, Proccess_Message};
                                        //mensaje a errores,mensaje a la bitacora, mensaje a trace, mensaje a procesos

        

        private static string message(int error, string description){            
           return  DateTime.Now.ToString("yyyy'-'MM'-'dd HH':'mm':'ss':'fff") + " - " + Logger.ErrorMessage((int)error) + " - " + description + "\r\n";               
        }

         public static void sendLog(int errorCode, string description, errorType error,Exception exc=null,string action="",int cantidad=0){
             if (Logger.ifWrite((int)error))
             {
                 #region File Write
                 if (Logger.ifFileWrite())
                 {
                     try
                     {
                         if (!(error == errorType.Proccess_Message))
                             Logger.fileWrite(message((int)error, description));
                     }
                     catch { }
                 }

                 #endregion

                 #region Services Write

                 switch (error)
                 {
                     case errorType.Log_Message:
                         {
                             try
                             {
                                 using (var proxy = new IServicioBitacora.ServicioBitacoraClient("NetTcpBinding_IServicioBitacora"))
                                 {
                                     var bitacora = new IServicioBitacora.BitacoraGeneral();
                                     bitacora.FechaBitacora = DateTime.Now;
                                     bitacora.CodSistema = Configuration.systemID;
                                     bitacora.CodUsuario = "NA";
                                     bitacora.Descripcion = description;
                                     bitacora.AccionRealizada = action;
                                     proxy.Agregar(bitacora);

                                 }
                             }
                             catch (Exception ex)
                             {
                                 string stringMessage = message((int)error, "Error al enviar al Web Service de Bitacora el siguiente mensaje(" + ex.Message + "): " + description);
                                 try
                                 {
                                     Logger.fileWrite(stringMessage);
                                 }
                                 catch (Exception e)
                                 {
                                     Logger.LogThis4Windows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + stringMessage + "]", "Unisys Duplicate Check", "Unisys Duplicate Check");
                                     System.Environment.Exit(0);
                                 }
                             }
                         } break;

                     case errorType.Information_Message:
                         {
                             try
                             {
                                 using (var proxy = new IServicioTrace.ServicioTraceClient("NetTcpBinding_IServicioTrace"))
                                 {
                                     var bitacora = new IServicioTrace.TraceGeneral();
                                     bitacora.Fecha = DateTime.Now;
                                     bitacora.FechaReal = DateTime.Now;
                                     bitacora.CodSistema = Configuration.systemID;
                                     bitacora.Detalle = description;
                                     proxy.Agregar(bitacora);

                                 }
                             }
                             catch (Exception ex)
                             {
                                 string stringMessage = message((int)error, "Error al enviar al Web Service de Trace el siguiente mensaje(" + ex.Message + "): " + description);
                                 try
                                 {
                                     Logger.fileWrite(stringMessage);
                                 }
                                 catch (Exception e)
                                 {
                                     Logger.LogThis4Windows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + stringMessage + "]", "Unisys Duplicate Check", "Unisys Duplicate Check");
                                     System.Environment.Exit(0);
                                 }
                             }
                         } break;
                     case errorType.Proccess_Message:
                         {
                             try
                             {
                                 using (var proxy = new IServicioProceso.ServicioProcesoClient("NetTcpBinding_IServicioProceso"))
                                 {
                                     var bitacora = new IServicioProceso.ProcesoGeneral();
                                     bitacora.FechaEjecucion = DateTime.Now;
                                     bitacora.CodSistema = Configuration.systemID;
                                     bitacora.Descripcion = description;
                                     bitacora.Accion = action;
                                     bitacora.CantidadRegistros = cantidad;
                                     proxy.Agregar(bitacora);

                                 }
                             }
                             catch (Exception ex)
                             {
                                 string stringMessage = message((int)error, "Error al enviar al Web Service de Procesos el siguiente mensaje(" + ex.Message + "): " + description);
                                 try
                                 {
                                     Logger.fileWrite(stringMessage);
                                 }
                                 catch (Exception e)
                                 {
                                     Logger.LogThis4Windows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + stringMessage + "]", "Unisys Duplicate Check", "Unisys Duplicate Check");
                                     System.Environment.Exit(0);
                                 }
                             }
                         } break;
                     case errorType.Error_Message:
                         {
                             try
                             {
                                 if (exc == null)
                                     sendError(errorCode, description);
                                 else
                                     sendError(errorCode, description + "[" + exc.Message + "]");
                             }
                             catch (Exception ex)
                             {
                                 string stringMessage = message((int)error, "Error al enviar al Web Service de Procesos el siguiente mensaje(" + ex.Message + "): " + description);
                                 try
                                 {
                                     Logger.fileWrite(stringMessage);
                                 }
                                 catch (Exception e)
                                 {
                                     Logger.LogThis4Windows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + stringMessage + "]", "Unisys Duplicate Check", "Unisys Duplicate Check");
                                     System.Environment.Exit(0);
                                 }
                             }
                         } break;
                 #endregion
                 }
             }
         }



        private static void sendError(int errorCode, string description){
            
            using (var proxy = new IServicioError.ServicioErrorClient("NetTcpBinding_IServicioError"))
            {
                var generalError = new IServicioError.ErrorGeneral();
                generalError.Fecha = DateTime.Now;
                generalError.FechaReal = DateTime.Now;
                generalError.CodError = errorCode;
                generalError.CodSistema = Configuration.systemID;
                generalError.DetalleError = description;
                proxy.Agregar(generalError);
            }               
        }
    }
}
